package canal

import (
	"bufio"
	"io"
)

// writer is a specialized RESP Value type writer.
type writer struct {
	*bufio.Writer
	cur []byte
}

// newWriter returns a new Writer.
func newWriter(w io.Writer) *writer {
	return &writer{
		bufio.NewWriter(w),
		make([]byte, 0),
	}
}

// write cur
func _copy(dest *[]byte, src []byte) {
	*dest = make([]byte, len(src))
	copy(*dest, src)
}

//  写入一个RESP值。
func (wr *writer) writeValue(v Value) error {
	b, err := v.MarshalRESP()
	if err != nil {
		return err
	}
	n, err := wr.Write(b)
	_copy(&wr.cur, b)
	if n < 1 {
		return &ErrProtocol{Msg: "write buf error."}
	}
	return err
}

// writeArray writes a RESP array.
func (wr *writer) writeArray(vals []Value) error { return wr.writeValue(ArrayValue(vals)) }

// writeMultiBulk写入包含一个或多个批量字符串的RESP数组。
func (wr *writer) writeMultiBulk(commandName string, args ...interface{}) error {
	err := wr.writeValue(MultiBulkValue(commandName, args...))	// MultiBulkValue返回包含一个或多个批量字符串的RESP数组。   |  wr.writeValue:  writeValue写入一个RESP值。
	if err != nil {
		return err
	}
	return wr.Flush()		// 刷新会将所有缓冲的数据写入底层io.Writer。
}

// get current command
func (wr *writer) get() []byte { return wr.cur }
